(function ($) {

	var leaf_id = "0";
	
// Напоминание о выборе строки
	function selRowPlease() {
		app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строку в таблице.", 'app-icon-stop32');
	}
	
    function Stock(area_id, caller) {
        var vdiv = area_id+'Tab';
		var area = $('#'+area_id);

		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');
        
		var pager_id = '#' + vdiv + 'Pager';
        var pager = $(pager_id);
		
		var el_status;
		var el_inv_date;
		
        var el_uni_id;
        var el_uni_name;
        var el_uni_full;
        var uni_name = '';
		
        var el_met_id;
        var el_met_name;
		
		var edit_div = 'div#editmod' + vdiv;

        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ];
        var col_names = ['Статис', 'ID', 'Дата', '№ накладной', '№ п/п', 'ID материала', 'Шифр', 'Описание',
						 'К-во', 'Остаток', 'ID Ед.', 'Ед.', 'Цена', 'Примечание'];
        var col_model = [
		    { name: 'status', index: 'status', hidden: true, width: 1, fixed: true, 
				sortable: false, search: false, editable: true,
				editoptions: { dataInit: function (el) { el_status = el; } }
			},
		    { name: 'id', index: 'sto_id', hidden: false, width: 80, editable: false, 
				formoptions: { label: '<div class="jqg-form-label">Идентификатор</div>'}
			},
			{ name: 'sto_inv_date', index:'sto_inv_date', hidden: false, width:80, editable: true,
            	editoptions: { style: "width:250px;", dataInit: function (el) { el_inv_date = el; } },
				formoptions: { label: '<div class="jqg-form-label">Дата накладной</div>'}
			},         
		    { name: 'sto_inv_num', index: 'sto_inv_num', hidden: false, width: 100, editable: true,
            	editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Номер накладной</div>'}
		    },
		    { name: 'sto_inv_pos', index: 'sto_inv_pos', hidden: false, width: 40, 
				sortable: false, search: false, editable: true,
            	editoptions: { maxlength: "4", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">№ позиции</div>'}
		    },
		    { name: 'sto_uni_id', index: 'sto_uni_id', hidden: true, width: 1, 
				sortable: false, search: false, editable: true,
		        editoptions: { maxlength: "16", dataInit: function (el) { el_uni_id = el; } }
		    },
		    { name: 'uni_name', index: 'uni_name', hidden: false, width: 100, editable: true,
		        editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_uni_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Шифр материала</div>'}
		    },
		    { name: 'uni_full', index: 'uni_full', hidden: false, width: 300, sortable: false, editable: true,
		        editoptions: { disabled: 'true', maxlength: "255", style: "width:250px;", dataInit: function (el) { el_uni_full = el; } },
				formoptions: { label: '<div class="jqg-form-label">Описание</div>'}
		    },
		    { name: 'sto_number', index: 'sto_number', hidden: false, width: 70, align:'right',
				sortable: false, search: false, editable: true,
				formatter:'number', formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '},
		        editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Количество</div>'}
		    },
		    { name: 'sto_remain', index: 'sto_remain', hidden: false, width: 70,  align:'right',
				search: false, editable: false,
				formatter:'number', formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '},
				formoptions: { label: '<div class="jqg-form-label">Остаток</div>'}
		    },
		    { name: 'sto_metric', index: 'sto_metric', hidden: true, width: 1, 
				sortable: false, search: false, editable: true,
		        editoptions: { maxlength: "16", dataInit: function (el) { el_met_id = el; } }
		    },
		    { name: 'met_name', index: 'met_name', hidden: false, width: 30, 
				sortable: false, search: false, editable: true, edittype:'select',
		        editoptions: { value: '', dataInit: function (el) { el_met_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Метрика</div>'}
		    },
		    { name: 'sto_price', index: 'sto_price', hidden: false, width: 80, align:'right', 
				sortable: false, search: false, editable: true,
				formatter:'number', formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '},
            	editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Цена</div>'}
		    },
		    { name: 'sto_comment', index: 'sto_comment', hidden: false, width: 150, 
				sortable: false, search: false, editable: true,
		        editoptions: { style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Примечание</div>'}
		    }
        ];

        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'stock/index' },
            emptyrecords: true,
            autowidth: false,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 25,
            multiboxonly: true,
            mtype: 'POST',
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 50,
            rowList: [50, 200, 1000],
            //		    viewrecords: true,
            loadui: 'disable',
            toolbar: [false, 'top'],
			toppager: false,
            filterbar: false,
            shrinkToFit: false,
            height: $('#'+area_id).innerHeight() - 77,
            width: $('#'+area_id).innerWidth() - 2,
            sortname: 'sto_id',
            sortorder: 'desc',
            sortable: true,
            caption: '',
            loadError: function () {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 999:    
                        alert(data.userdata.errmess);
                        break;
                    case 99:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        alert( data.userdata.errmess );
                        break;
                }
				var row_id, status;
				var stats = gritab.getCol( 'status', true );
				for( var i=0; i<stats.length; i++ ) {
					row_id = stats[i].id;
					status = stats[i].value;
					if( (status & 1 ) == 1 ) {
						gritab.jqGrid('setCell',row_id,'id','','ui-state-error');
					}
				}
            },
			beforeRequest: function() {
				$('#' + vdiv).jqGrid('setGridParam',{postData:{'leaf_id':leaf_id} });
			},
            ondblClickRow: function (id, iRow, iCol) {
				var status = gritab.getCell( id, 'status' );
				if( status & 0x6 ) {
					app.alert('AlertDlg', 'Внимание', "Изменение этой позиции уже запрещено.", 'app-icon-stop32');
					return;
				}
                $('#' + vdiv).jqGrid('editGridRow', id,
                {
					width: 450,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    editData: { q: 'stock/update' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
					beforeSubmit: TestNewData, 
                    afterSubmit: responseOnSubmit,
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
                }
                );
            }
        };

		function onShowAddForm(fm) {
            BindCalendar(fm, $(el_inv_date));
			SetUniHack();
            $(edit_div).css({'overflow':'visible'}).shadow();
		}
		
		function onShowEditForm(fm) {
			getunimet();
            BindCalendar(fm, $(el_inv_date));
			SetUniHack();
            $(edit_div).css({'overflow':'visible'}).shadow();
/*			
			var status = $(el_status).val();
			$(el_inv_tax).prop('readonly', ((status & 1) == 0) ? true : false);
*/			
		}
		        
		function onCloseEditForm() {
			$(el_uni_name).autocomplete( "destroy" ).unbind();
			$(el_inv_date).datepicker( "destroy" ).unbind();
			$(el_met_name).empty().unbind();
			return true;
		}
		
// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Индикация ошибок при вводе, ред., удал.
        function TestNewData(pd, formid) {
            var result = true, mess = '';
/*			
            if( pd.inc_cont_id == '' || pd.inc_build_id == '' || pd.inc_bank_date == '') {
                result = false;
                mess = 'Данные введены с ошибками !!!';
            }
*/
            return[result,mess];
        }
        
// Индикация серверных ошибок добавления.
        function responseOnAdd(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) {
                success = false;
                msg = rsp.errmess;
            }
			else {
				$('.FormGrid .FormElement').val('');
				$('.FormGrid select.FormElement').find('*').remove();
				$('.FormGrid input#sto_inv_date').val(postdata.sto_inv_date);
				$('.FormGrid input#sto_inv_num').val(postdata.sto_inv_num);
				$('.FormGrid input#sto_inv_pos').val(++postdata.sto_inv_pos);
				$('.FormGrid input#uni_name').focus();
			}	
            return [success, msg];
        }

// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) {
                success = false;
                msg = rsp.errmess;
            }
				
            return [success, msg];
        }

// Навигатор - создаем панель инструментов
        gritab.jqGrid('navGrid', pager_id, {
				add:false,del:false,edit:false,view:false,search:false,refresh:false });
        
// Пользовательский навигатор - создать
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Добавить',
            title: 'Создать запись',
            buttonicon: 'ui-icon-plus',
            onClickButton: function() { 
				gritab.jqGrid('editGridRow', 'new', {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    editData: { q: 'stock/insert' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowAddForm,
                    afterSubmit: responseOnAdd,
					clearAfterAdd: false,
					beforeSubmit: TestNewData, 
                    closeAfterAdd: false,
					onClose: onCloseEditForm
				});
			}
        });
// Пользовательский навигатор - редактирование
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Изменить',
            title: 'Редактировать выбранную запись',
            buttonicon: 'ui-icon-pencil',
            onClickButton: function() { 
				var rowlist = gritab.getGridParam('selarrrow');
				if( rowlist.length == 0 ) { selRowPlease(); return; }
				if( rowlist.length > 1 ) {
					app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите только одну строку в таблице.", 'app-icon-stop32');
					return;
				}
				var status = gritab.getCell( rowlist[0], 'status' );
				if( status & 0x6 ) {
					app.alert('AlertDlg', 'Внимание', "Изменение этой позиции уже запрещено.", 'app-icon-stop32');
					return;
				}
				gritab.jqGrid('editGridRow', rowlist[0], {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    editData: { q: 'stock/update' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
                    afterSubmit: responseOnSubmit,
					beforeSubmit: TestNewData, 
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
				});
			}
        });		
// Пользовательский навигатор - удаление
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Удалить',
            title: 'Удаление выбранной записи',
            buttonicon: 'ui-icon-trash',
            onClickButton: function() {
				var status, rowdis = '';
				var rowarr = gritab.getGridParam('selarrrow');
				var rowlist = rowarr.toString();
				if( !rowlist ) { selRowPlease(); return; }
				for( var i = 0; i < rowarr.length; i++ ) {
					status = gritab.getCell( rowarr[i], 'status' );
					if( status & 0x6 )
						rowdis += (rowdis.length ? ', ' : '' )+"'"+rowarr[i]+"'";
				}
				if( rowdis.length ) {
					app.alert('AlertDlg', 'Внимание', "Удаление позиции(й) "+rowdis+" уже запрещено.", 'app-icon-stop32');
					return;
				}
				gritab.jqGrid('delGridRow', rowlist, {
                    modal: true,
                    jqModal: true,
                    width: 250,
					msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
							'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
					resize: false,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    delData: { q: 'stock/delete' },
                    afterShowForm: function() { $('div#delmod' + vdiv).shadow(); },
                    afterSubmit: responseOnSubmit
				});
			}
        });
// Пользовательский навигатор - просмотр
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Просмотр',
            title: 'Показать в виде формы',
            buttonicon: 'ui-icon-document',
            onClickButton: function() { 
				var rowlist = gritab.getGridParam('selarrrow');
				if( rowlist.length == 0 ) { selRowPlease(); return; }
				if( rowlist.length > 1 ) {
					app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите только одну строку в таблице.", 'app-icon-stop32');
					return;
				}
				gritab.jqGrid('viewGridRow', rowlist[0], {
					width: 400,
					resize: true,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    viewPagerButtons: false,
					labelswidth: '30%',
					beforeShowForm: function(fm) { 
						$(fm).find("table:first td").css({'white-space':'normal','vertical-align':'top'});
						$('div#viewmod' + vdiv).shadow(); 
					}
				});
			}
        });
// Пользовательский навигатор - спиание
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Списать',
			title: 'Списать отмеченные позиции',
			buttonicon: 'ui-icon-arrowthickstop-1-s',
			onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				app.confirm('AlertDlg', 'Требуется подтверждение операции', 
					"Выполнить списание со склада всех отмеченных позиций ?", 'app-icon-quest32', RetireStockList );
				function RetireStockList() {
					var prm = { q: 'stock/retire', sto_ids: rowarr.toString() };
					$.post('index.php', prm, function (rsp, textStatus) {
						if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
						if (rsp.errcode) app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						gritab.trigger("reloadGrid");
					}, 'json');
				}
			}
		});    
		
// Пользовательский навигатор - обновить
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Обновить',
			title: 'Обновить таблицу',
			buttonicon: 'ui-icon-refresh',
			onClickButton: function() { 	gritab.trigger("reloadGrid"); }
		});    
        
// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

// Прикрепить календарь к ячейке поиска
		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_sto_inv_date") );
		
        function BindCalendar(fm, el) {
            $(el).datepicker({
				onClose: function(dt, inst) {				
					if( $(fm).hasClass('ui-search-toolbar') && dt != '' ) gritab[0].triggerToolbar();
				},
                dateFormat: "dd.mm.yy",
                showOn: "button",
                buttonImage: "img/calendar2.png",
                buttonImageOnly: true,
                buttonText: "Календарь",
                changeMonth: true,
                changeYear: true
            });

            fm.find(".ui-datepicker-trigger")
                .css({ 'cursor': 'pointer', 'position': 'relative', 'left': '-18px', 'top': '3px' });
            $(el).attr("title", "Формат ввода: 'дд.мм.гггг'");                
        }

		
        function SetUniHack() {
			$(el_uni_full).prop('readonly', true );
			$(el_met_name).prop('readonly', true );

            $(el_uni_name).autocomplete({
				html: true,
				appendTo: edit_div,
                source: function (request, responce) {
                    $.post('index.php', { q: 'units/find', term: request.term },
                    function (rsp, textStatus) {
						if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.uni_name + ' ( '+item.uni_full+' )', 
										 uni_id: item.uni_id, 
										 uni_name: item.uni_name,  
										 uni_full: item.uni_full,
										 met_id: item.met_id,
										 met_name: item.met_name,
										 met_opt_id: item.met_opt_id,
										 met_opt_name: item.met_opt_name
										}
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_uni_id).val(ui.item.uni_id);
                    $(el_uni_name).val(ui.item.uni_name.replace(/<(b|\/b)>/g,''));
                    $(el_uni_full).val(ui.item.uni_full.replace(/<(b|\/b)>/g,''));
                    uni_name = $(el_uni_name).val();
	
					$(el_met_id).val('');
					set_metrics( ui.item );
                    return false;
                }
            });
            uni_name = $(el_uni_name).val();
            $(el_uni_name).bind( 'focusout', function () { 
                if( $(el_uni_name).val() != uni_name ) { 
                    uni_name = '';
                    $(el_uni_id).val('');
                    $(el_uni_name).val('');
                    $(el_uni_full).val('');					
                    $(el_met_id).val('');
                    $(el_met_name).empty();
                }
            });            
            $(el_met_name).bind( 'change', function () { $(el_met_id).val( $(el_met_name).val() );  });            
        }

        function getunimet() {
			var uni_id = $(el_uni_id).val();
			if(uni_id == '' || uni_id == '0' ) return;
            $.post('index.php', { q: 'units/getunimet', uni_id: uni_id },
				function (rsp, textStatus) {
					if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
					if (rsp.errcode) {
						if (rsp.errcode == '999') { alert(rsp.errmess); }
						else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						return;
					}
					if (rsp.data) 
						set_metrics( rsp.data );
				}, 
			'json');
        }
		
		function set_metrics( o ) {
			var sel = $(el_met_name);
			var p = $(el_met_id).val();
			
			sel.empty().append('<option value="0">Выберите ...</option>');
			sel.append('<option value="'+o.met_id+'">'+o.met_name+'</option>');
				
			if( o.met_opt_id != '' )
				sel.append('<option value="'+o.met_opt_id+'">'+o.met_opt_name+'</option>');			
			
			if( p == '' || p == '0' ) return;
			
			sel.val(p);
		}
		
		this.Destroy = function() {
			$("#gview_" + vdiv + " #gs_sto_inv_date").datepicker( "destroy" ).unbind();
			gritab.GridDestroy(vdiv);
			area.empty();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.innerWidth() - 2 );
			gritab.setGridHeight( area.innerHeight() - 77 );
		};

		this.Refresh = function() { gritab.trigger("reloadGrid"); };
		
	};  // End of create function definition


	function StockProxy() {
		var oTab, area;
		var active = false;
		
		this.Open = function( area_id ) {
			if( active  ) return;
			area = area_id;
			$('#'+area+'Title').show();
			CreatePannel();
//			oTab = new Stock( area_id, this ); 
			$(window).bind( 'resize', oTab.Resize );
			active = true;
		};
		this.Close = function() { 
			if( !active  ) return;
			$(window).unbind( 'resize', oTab.Resize );
			RemovePannel();
//			oTab.Destroy();
			$('#'+area+'Title').hide();
			active = false;
		};
		this.Resize = function() { oTab.Resize(); };
		
		function CreatePannel() {
			var l_area = area+'_left';
			var r_area = area+'_right';
			$('#'+area).append(
				'<div id="'+l_area+'" style="position:absolute;top:0;left:0;width:200px;bottom:3px;" class="ui-widget-content ui-corner-all"></div>'+
				'<div id="'+r_area+'" style="position:absolute;top:0;left:204px;right:0;bottom:0;"></div>'
			);
			$('#'+l_area).dynatree({
				clickFolderMode: 1,
				initAjax: {	url: "index.php", data: { q: "unitree/gettree" } },
				onClick: function(node, event) {
					if( node.hasChildren() && node.getEventTargetType(event) == "title"){ node.toggleExpand(); }
					return true;
				},			
				onActivate: function(node) { leaf_id = node.data.key; oTab.Refresh(); },
				onPostInit: function( isReload ) {
					if( !isReload ) {
						var node = $('#'+l_area).dynatree("getActiveNode");
						if( node ) node.deactivate();
					}
				}
			});
			
			oTab = new Stock( r_area, this.caller ); 			
		}
		
		function RemovePannel() {
			oTab.Destroy();
			$('#'+area).empty();
		}
	}
	
	app.Stock = new StockProxy();
	
    // ---------------------------------------------------------------------------
})(jQuery);
